package integracion;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import negocio.TransferGeneral;

public class DAOGeneralImp implements DAOGeneral{

	Connection _conexionBBDD;	
	
	
	private static DatosBBDD datosBBDD=CargadorBBDD.getParametrosBBDD();

	
	public DAOGeneralImp() {
		super();
		try {

			Class.forName("com.mysql.jdbc.Driver");
			_conexionBBDD = DriverManager.getConnection("jdbc:mysql://"+datosBBDD.getDireccion()+"/"+datosBBDD.getNombreBBDD(), datosBBDD.getUser(), datosBBDD.getPass());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}



	@Override
	public boolean getDatosUsuario(TransferGeneral datos) {
		String sql="SELECT u.tipo,u.nombre,u.apellido1,u.apellido2\n"
				+"FROM usuario u\n"
				+"WHERE u.dni="+datos.getDniUsuario()+";";
		
		try {
			Statement sentencia=_conexionBBDD.createStatement();
			sentencia.executeQuery(sql);
			ResultSet res=sentencia.getResultSet();
			
			if (res.next()){
				int valTipo=res.getInt("tipo");
				datos.setPuesto(valTipo);
				datos.setNombre(res.getString("nombre"));
				datos.setApellido1(	res.getString("apellido1"));
				datos.setApellido2(	res.getString("apellido2"));
				return true;
			}else{
				return false;
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return false;

	}


	
	private String puestoToString(int valTipo ){
		
		String puesto="";
		switch(valTipo){
		case 0 : puesto="director";break;
		case 1 : puesto="profesor";break;
		case 2 : puesto="mantenimiento";break;
		case 3 : puesto="marketing";break;
		case 4 : puesto="secretaria";break;
		case 5 : puesto="administrativo";break;
		case 6 : puesto="alumno";break;
		default: puesto="fantasma";break;
		}
		return puesto;
	}



	@Override
	public boolean getListaCorreoSaliente(TransferGeneral datos) {
		String sql="SELECT u.nombre, u.apellido1,u.apellido2,c.asunto,c.idCorreo,DATE_FORMAT(c.tiempo,'%d-%c-%y') as fecha\n"
				+"FROM correo c, usuario u\n"
				+"WHERE \n"
				+"c.dniDe="+datos.getDniUsuario()+" and c.dniPara=u.dni\n"
				+"ORDER BY  c.tiempo DESC;";
		try {
			Statement sentencia=_conexionBBDD.createStatement();
			sentencia.executeQuery(sql);
			ResultSet res=sentencia.getResultSet();
			
			ArrayList<String> correoSalienteUsuarioNombre = new ArrayList<String> ();

			ArrayList<String> correoSalienteUsuarioApellido1= new ArrayList<String> ();

			ArrayList<String> correoSalienteUsuarioApellido2= new ArrayList<String> ();

			ArrayList<String> correoSalienteAsunto= new ArrayList<String> ();

			ArrayList<String> correoSalienteFecha= new ArrayList<String> ();
		
			ArrayList<Integer> correoSalienteId= new ArrayList<Integer> ();
			
			while (res.next()){
				
				correoSalienteUsuarioNombre.add(res.getString("nombre"));
				correoSalienteUsuarioApellido1.add(res.getString("apellido1"));
				correoSalienteUsuarioApellido2.add(res.getString("apellido2"));
				correoSalienteAsunto.add(res.getString("asunto"));
				
				correoSalienteFecha.add(res.getString("fecha"));
				
				correoSalienteId.add(res.getInt("idCorreo"));


			}
			datos.setCorreoSalienteUsuarioNombre(correoSalienteUsuarioNombre);
			datos.setCorreoSalienteUsuarioApellido1(correoSalienteUsuarioApellido1);
			datos.setCorreoSalienteUsuarioApellido2(correoSalienteUsuarioApellido2);

			datos.setCorreoSalienteAsunto(correoSalienteAsunto);
			datos.setCorreoSalienteFecha(correoSalienteFecha);
			datos.setCorreoSalienteId(correoSalienteId);

			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		
		

		
		return true;
		
	}



	@Override
	public boolean getListaCorreoEntrante(TransferGeneral datos) {
	
		String sql="SELECT u.nombre, u.apellido1,u.apellido2,c.asunto,c.leido,c.idCorreo,DATE_FORMAT(c.tiempo,'%d-%c-%y') as fecha\n"
				+"FROM correo c, usuario u\n"
				+"WHERE \n"
				+"c.dniPara="+datos.getDniUsuario()+" and c.dniDe=u.dni\n"
				+"ORDER BY c.tiempo DESC;";
		
		try {
			Statement sentencia=_conexionBBDD.createStatement();
			sentencia.executeQuery(sql);
			ResultSet res=sentencia.getResultSet();
			
			ArrayList<String> correoEntranteUsuarioNombre = new ArrayList<String> ();

			ArrayList<String> correoEntranteUsuarioApellido1= new ArrayList<String> ();

			ArrayList<String> correoEntranteUsuarioApellido2= new ArrayList<String> ();

			ArrayList<String> correoEntranteAsunto= new ArrayList<String> ();

			ArrayList<String> correoEntranteFecha= new ArrayList<String> ();
			
			ArrayList<Integer> correoEntranteLeido= new ArrayList<Integer> ();
			ArrayList<Integer> correoEntranteId= new ArrayList<Integer> ();
			
			while (res.next()){
				
				correoEntranteUsuarioNombre.add(res.getString("nombre"));
				correoEntranteUsuarioApellido1.add(res.getString("apellido1"));
				correoEntranteUsuarioApellido2.add(res.getString("apellido2"));
				correoEntranteAsunto.add(res.getString("asunto"));
				
				correoEntranteFecha.add(res.getString("fecha"));
				
				correoEntranteLeido.add(res.getInt("leido"));
				correoEntranteId.add(res.getInt("idCorreo"));

			}
			datos.setCorreoEntranteUsuarioNombre(correoEntranteUsuarioNombre);
			datos.setCorreoEntranteUsuarioApellido1(correoEntranteUsuarioApellido1);
			datos.setCorreoEntranteUsuarioApellido2(correoEntranteUsuarioApellido2);

			datos.setCorreoEntranteAsunto(correoEntranteAsunto);
			datos.setCorreoEntranteFecha(correoEntranteFecha);
			datos.setCorreoEntranteLeido(correoEntranteLeido);
			datos.setCorreoEntranteId(correoEntranteId);
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		
		

		
		return true;
		
		
	}



	@Override
	public boolean getListaPersonal(TransferGeneral datos) {
		int tipo= datos.getTipoUsuario();
		String sql="SELECT u.nombre,u.apellido1,u.apellido2,u.dni\n"
				+"FROM usuario u\n"
				+"WHERE u.tipo="+tipo+";";
		try {
			Statement sentencia=_conexionBBDD.createStatement();
			sentencia.executeQuery(sql);
			ResultSet res=sentencia.getResultSet();
			
			ArrayList<String> usuarioNombre = new ArrayList<String> ();

			ArrayList<String> usuarioApellido1= new ArrayList<String> ();

			ArrayList<String> usuarioApellido2= new ArrayList<String> ();
			ArrayList<Integer> usuarioId= new ArrayList<Integer> ();
			
			
			while(res.next()){
				usuarioNombre.add(res.getString("nombre"));
				usuarioApellido1.add(res.getString("apellido1"));
				usuarioApellido2.add(res.getString("apellido2"));
				
				usuarioId.add(res.getInt("dni"));
				
			}
			
			datos.setUsuarioNombre(usuarioNombre);
			datos.setUsuarioApellido1(usuarioApellido1);
			datos.setUsuarioApellido2(usuarioApellido2);
			datos.setUsuarioId(usuarioId);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		return true;
		
		
	}



	@Override
	public boolean nuevoCorreo(TransferGeneral datos) {
		// TODO Auto-generated method stub
		String sql="INSERT INTO correo (tiempo,DNIde,DNIpara,asunto,contenido) VALUES (NOW(),"+
		datos.getDniUsuario()+","+datos.getDniDestinoNuevo()+",\""+datos.getAsuntoNuevo()+"\",\""+datos.getContenidoNuevo()+"\");";
		try {
			Statement sentencia=_conexionBBDD.createStatement();
			sentencia.executeUpdate(sql);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		
		return true;
	}



	@Override
	public boolean getCorreo(TransferGeneral datos) {
		
		String sql="SELECT u1.nombre as nombreOrigen, u1.apellido1 as apellido1Origen,u1.apellido2 as apellido2Origen, u2.nombre as nombreDestino, u2.apellido1 as apellido1Destino,u2.apellido2 as apellido2Destino,c.asunto,c.contenido,DATE_FORMAT(c.tiempo,'%d-%c-%y') as fecha\n"
				+"FROM correo c, usuario u1, usuario u2\n"
				+"WHERE \n"
				+"c.idCorreo="+datos.getIdCorreoLeer()+" and c.dniDe=u1.dni and c.dniPara=u2.dni\n";
		
		try {
			Statement sentencia=_conexionBBDD.createStatement();
			sentencia.executeQuery(sql);
			ResultSet res=sentencia.getResultSet();
			if (res.next()){
				datos.setNombreDestinoLeer(res.getString("nombreDestino"));
				datos.setApellido1DestinoLeer(res.getString("apellido1Destino"));
				datos.setApellido2DestinoLeer(res.getString("apellido2Destino"));
				
				datos.setNombreOrigenLeer(res.getString("nombreOrigen"));
				datos.setApellido1OrigenLeer(res.getString("apellido1Origen"));
				datos.setApellido2OrigenLeer(res.getString("apellido2Origen"));
				
				datos.setAsuntoLeer(res.getString("asunto"));
				datos.setContenidoLeer(res.getString("contenido"));
				datos.setFechaLeer(res.getString("fecha"));

			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		
		return true;
		
	}
	
	public boolean marcarLeidoCorreo(TransferGeneral datos) {
		// TODO Auto-generated method stub
		String sql="UPDATE correo SET leido=leido+1 WHERE idCorreo="+datos.getIdCorreoLeer()+";";
		
		try {
			Statement sentencia=_conexionBBDD.createStatement();
			sentencia.executeUpdate(sql);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		
		return true;
	}



	@Override
	public boolean login(TransferGeneral datos) {
		String sql="SELECT u.dni, u.tipo, u.password, u.fechaFin\n"
				+"FROM usuario u\n"
				+"WHERE \n"
				+"u.dni="+datos.getDniLogin()+" and u.fechaFin IS null \n";
		
		try {
			Statement sentencia=_conexionBBDD.createStatement();
			sentencia.executeQuery(sql);
			ResultSet res=sentencia.getResultSet();
			if (res.next()){
				if(res.getString("password")!=null && !res.getString("password").equals("")){
					
				
					if (res.getString("password").equals(datos.getPassLogin())){
						datos.setLoginCorrecto(true);
						datos.setPedirNewPass(false);
						datos.setTipoLogin(res.getInt("tipo"));

					}else{
						datos.setLoginCorrecto(false);
					
					}
					
				}else{
					datos.setLoginCorrecto(true);
					datos.setPedirNewPass(true);
					datos.setTipoLogin(res.getInt("tipo"));
					
				}

			}else{
				datos.setLoginCorrecto(false);
				
				
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		
		return true;
	}



	@Override
	public boolean newPass(TransferGeneral datos) {
		// TODO Auto-generated method stub
		String sql="UPDATE usuario SET password='"+datos.getPassNueva()+"' WHERE dni="+datos.getDniLogin()+";";
		
		try {
			Statement sentencia=_conexionBBDD.createStatement();
			sentencia.executeUpdate(sql);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		
		return true;
	}
	
	
}
